package com.baiyue.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baiyue.entity.PaymentRecords;
import com.baiyue.exception.GlobalException;
import com.baiyue.mapper.PaymentRecordsMapper;
import com.baiyue.model.PaymentRecords.PaymentRecordsDataRequest;
import com.baiyue.model.charging.ChargingDataRequest;
import com.baiyue.result.CodeMsg;
import com.baiyue.service.ChargingService;
import com.baiyue.service.PaymentRecordsService;
import com.baiyue.utils.BeanMapperUtil;
import com.baiyue.utils.ChargingStatus;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Objects;

/**
 *
 * @author 伍波
 * @date 2024-07-11
 */
@Service
public class PaymentRecordsServiceImpl implements PaymentRecordsService {
    private static final Logger logger = LoggerFactory.getLogger(PaymentRecordsServiceImpl.class);

    @Autowired
    private PaymentRecordsMapper paymentRecordsMapper;

    @Autowired
    private ChargingService chargingService;

    /**
     * 新增结算订单，并更新 包间状态
      * @param request
     */
    @Override
    public void insertPaymentRecords(PaymentRecordsDataRequest request) {
        logger.info("新增结算单入参：{}", JSONObject.toJSONString(request));
        validateRequest(request);

        if (isPaymentAlreadyExists(request.getUuid())) {
            logger.warn("该包间uuid已结算，uuid: {}", request.getUuid());
            throw new GlobalException(CodeMsg.TABLE_CHARGING_CLOSE);
        }

        PaymentRecords paymentRecords = BeanMapperUtil.map(request, PaymentRecords.class);
        paymentRecordsMapper.insert(paymentRecords);
        updateChargingDetails(request);
    }

    /**
     * 校验支付记录请求数据的合法性
     * 在处理支付记录之前，需要确保请求数据中的必要信息完整且合法
     * 此方法主要负责检查请求中的uuid是否为空，因为uuid是后续处理流程中不可或缺的标识
     *
     * @param request 支付记录请求对象，包含了需要校验的数据
     * @throws GlobalException 如果uuid为空，则抛出全局异常，提示错误信息
     */
    private void validateRequest(PaymentRecordsDataRequest request) {
        // 检查请求中的uuid是否为空，如果为空，则记录日志并抛出异常
        if (StringUtils.isEmpty(request.getUuid())) {
            logger.warn("新增结算单失败：uuid为空");
            throw new GlobalException(CodeMsg.BIND_ERROR.fillArgs("uuid"));
        }
    }

    /**
     * 检查支付记录是否已存在
     * 通过查询数据库中是否存在具有特定UUID的支付记录来判断支付记录是否已存在
     * 此方法用于避免重复的支付记录被创建
     *
     * @param uuid 支付记录的唯一标识符，用于数据库查询
     * @return 如果找到具有相同UUID的支付记录，则返回true，表示支付记录已存在；否则返回false
     */
    private boolean isPaymentAlreadyExists(String uuid) {
        // 根据UUID查询数据库中的支付记录
        PaymentRecords existingPayment = paymentRecordsMapper.selectByUuid(uuid);
        // 判断查询结果是否非空，非空表示支付记录已存在
        return Objects.nonNull(existingPayment);
    }

    private void updateChargingDetails(PaymentRecordsDataRequest request) {
        ChargingDataRequest dataRequest = new ChargingDataRequest();
        dataRequest.setUuid(request.getUuid());
        dataRequest.setId(request.getChargingId());
        dataRequest.setTableId(request.getTableId());
        dataRequest.setStopTime(new Date()); // 可以考虑使用 LocalDateTime
        dataRequest.setStatus(ChargingStatus.COMPLETED); // 使用常量替代

        chargingService.updateChargingAndTableSet(dataRequest);
    }
}
